MySql主从同步过程知识讲解
Tech导读
MySql是常用的数据库,本文将为读者带来MySql主从同步知识点的分享,巩固MySql基础知识。通过图文并茂地讲解如何解决主从同步一致性的问题,也可以让读者们全方位了解MySql主从同步的过程。
导读
MySql是常用的数据库,本文将为读者带来MySql主从同步知识点的分享,巩固MySql基础知识。通过图文并茂地讲解如何解决主从同步一致性的问题,也可以让读者们全方位了解MySql主从同步的过程。01 MySql主从同步概述
在今年的敏捷团队建设中,我通过Suite执行器实现了一键自动化单元测试。Juint除了Suite执行器还有哪些执行器呢?由此我的Runner探索之旅开始了!
Redis是一种高性能的内存数据库,但不是今天的主角;MySQL是基于磁盘文件的关系型数据库,相比于Redis来说,读取速度会慢一些,但是功能强大,可以用于存储持久化的数据。在实际工作中常将Redis作为缓存与MySQL配合来使用,当有数据访问请求的时候,首先会从缓存中进行查找,如果存在就直接取出,如果不存在再访问数据库,这样就提升了读取的效率,也减少了后端数据库的访问压力。使用Redis这种缓存架构是高并发架构中非常重要的一环。
图1 通常Redis使用示例图
接下来将讲解主从同步有哪些作用,以及主从同步具体是怎么实现的。
02 主从同步的作用
理解,首先 MCube 会依据模板缓存状态判断是否需要网络获取最新模板,当获取到模板后进行模板加载,加载阶段会将产物转换为视图树的结构,转换完成后将通过表达式引擎解析表达式并取得正确的值,通过事件解析引擎解析用户自定义事件并完成事件的绑定,完成解析赋值以及事件绑定后进行视图的渲染,最终将目标页面展示到屏幕。
2.1 读写分离
2.2 数据备份
2.3 高可用性
数据备份实际是一种冗余的机制,通过这种冗余的方式可以换取数据库的高可用性,当服务器出现故障、宕机等无可用的情况下,可以迅速进行故障切换,让从库充当主库,保障服务正常运行。读者们可以了解下电商系统数据库高可用SLA指标。
03 主从同步的原理
理解,首先 MCube 会依据模板缓存状态判断是否需要网络获取最新模板,当获取到模板后进行模板加载,加载阶段会将产物转换为视图树的结构,转换完成后将通过表达式引擎解析表达式并取得正确的值,通过事件解析引擎解析用户自定义事件并完成事件的绑定,完成解析赋值以及事件绑定后进行视图的渲染,最终将目标页面展示到屏幕。
二进制日志是一个文件,在进行网络传输的过程中就一定会存在一些延迟,比如200ms,这样就可能造成用户在从库上读取的数据不是最新的数据,也就会造成主从同步中的数据不一致的情况发生。比如对一条记录进行更新,这个操作是在主库上完成的,而在很短的时间内,比如100ms,又对同一个记录进行读取,此时从库还没有完成数据的同步,那么通过从库读取到的数据就是一条旧数据。这种情况下该怎么办呢?
04 如何解决主从同步的数据一致性问题
理解,首先 MCube 会依据模板缓存状态判断是否需要网络获取最新模板,当获取到模板后进行模板加载,加载阶段会将产物转换为视图树的结构,转换完成后将通过表达式引擎解析表达式并取得正确的值,通过事件解析引擎解析用户自定义事件并完成事件的绑定,完成解析赋值以及事件绑定后进行视图的渲染,最终将目标页面展示到屏幕。
可以想象下如果想要操作的数据都存储在同一个数据库中,那么对数据进行更新的时候可以对记录进行加写锁,这样在读取的时候就不会发生数据不一致的情况。但这时从库的作用就是备份数据,没有做到读写分离,分担主库的压力。
因此还需要想办法在进行读写分离的时候,解决主从同步中数据不一致的问题,也就是解决主从之间数据复制方式的问题,如果按照数据一致性从弱到强来进行划分,有以下三种复制方式。
4.1 全同步复制
全同步复制是当主库执行完一个事务之后,要求所有的从库也都必须执行完该事务,才可以返回处理结果给客户端;因此,虽然全同步复制数据一致性得到保证了,但是主库完成一个事物需要等待所有从库也完成,性能就比较低了。如下图:
图4 全同步复制示例图
4.2 异步复制
异步复制是当主库提交事物后,会通知binlog dump线程发送binlog日志给从库,一旦binlog dump线程将binlog日志发送给从库之后,不需要等到从库也同步完成事务,主库就会将处理结果返回给客户端。
因为主库只需要执行完事务就可以将处理结果返回给客户端,而不用关心从库是否执行完事务,这就可能导致短暂的主从数据不一致的问题了,比如刚在主库插入的新数据,如果马上在从库查询就可能查询不到。
当主库提交事物后,如果宕机挂掉了,此时可能binlog还没来得及同步给从库,这时候如果为了恢复故障切换主从节点的话,就会出现数据丢失的问题,所以异步复制虽然性能高,但数据一致性上是最弱的。
mysql主从复制,默认采用的就是异步复制这种复制策略。
图5 异步复制示例图
4.3 半同步复制
图6 半同步复制示例图
但是,半同步复制也存在以下几个问题:
半同步复制的性能,相比异步复制而言有所下降;异步复制是不需要等待任何从库是否接收到数据的响应,而半同步复制则需要等待至少一个从库确认接收到binlog日志的响应,性能上是损耗更大的。
主库等待从库响应的最大时长是可以配置的,如果超过了配置的时间,半同步复制就会变成异步复制,那么,异步复制的问题同样也就会出现了。
在MySQL 5.7.2之前的版本中,半同步复制存在着幻读问题的。
当主库成功提交事物并处于等待从库确认的过程中,这个时候,从库还没来得及返回处理结果给客户端,但因为主库存储引擎内部已经提交事务了,所以,其他客户端是可以从主库中读到数据的。
但是,如果下一秒主库突然宕机,此时正好下一次请求过来,就只能把请求切换到从库中,因为从库还没从主库同步完毕数据,所以,从库中就不会读到这条数据,和上一秒读取数据的结果对比就造成了幻读的现象。
4.4 增强半同步复制
增强半同步复制,是mysql 5.7.2后的版本对半同步复制做的一个改进,原理上几乎是一样的,主要是解决幻读的问题。
主库配置了参数 :rpl_semi_sync_master_wait_point = AFTER_SYNC 后,主库在存储引擎提交事务前,必须先收到从库数据同步完成的确认信息后,才能提交事务,以此来解决幻读问题。参考下图:
05 总结
理解,首先 MCube 会依据模板缓存状态判断是否需要网络获取最新模板,当获取到模板后进行模板加载,加载阶段会将产物转换为视图树的结构,转换完成后将通过表达式引擎解析表达式并取得正确的值,通过事件解析引擎解析用户自定义事件并完成事件的绑定,完成解析赋值以及事件绑定后进行视图的渲染,最终将目标页面展示到屏幕。
而采用中间件的方法有很明显的优势:功能强大,使用简单。但因为在客户端和数据库之间增加了中间件层会有一些性能损耗,同时商业中间件价格较高,有一定学习成本。另外也可以考虑采用一些优秀的开源工具,比如 MaxScale。它是 MariaDB 开发的 MySQL 数据中间件,使用 MaxScale作为数据库的代理,通过路由转发完成了读写分离。同时也可以使用 MHA 工具作为强一致的主从切换工具,从而完成 MySQL的高可用架构。
拜占庭将军问题和 Raft 共识算法讲解
交易履约订单中心实践
zookeeper的Leader选举源码解析
求分享
求点赞
求在看